package com.wang.tool.task;


import com.wang.tool.lock.core.LockBody;

/**
 * @Description 异步任务回调器
 * @Author shaopeng
 * @Date 2023/6/2
 * @Version 1.0
 * @see TaskManage
 */
public interface TaskHandler<P> {

    /**
     * handlerName
     * 单例唯一
     *
     * @return 非空
     */
    String getName();

    /**
     * 任务发起
     * 任务全生命周期仅调用一次
     * 入表时调用
     * @see TaskManage#create
     * 注意：不要是长耗时操作，此操作会在数据库事务中执行
     *
     * @param task  非空
     * @param param 创建task时透传参数
     * @return 返回值建议非空
     */
    TaskStage pre(Task task, P param);

    /**
     * 状态检查
     * 任务全生命周期可能调用多次
     * @see TaskManage#check
     * 注意：不要是长耗时操作，此操作会在数据库事务中执行
     * 极度建议返回值非空，且更新check时间，不然会一直自检
     *
     * @param task 非空
     * @return 非空
     */
    TaskStage check(Task task);


    /**
     * 构建执行任务时的业务锁
     * 如果返回空则代表是无业务锁运行
     *
     * @param task 非空
     * @return
     */
    LockBody generateBizLockBody(Task task);

}
